import { Dayjs } from 'dayjs'
import { ColDef, ICellRendererParams } from '@ag-grid-community/core'

import { IEventTemplateEnableRes } from '@oBiz/components/EventSelect/api'

export interface IWaybillRecordListReq {
  /**
   * 认证信息
   */
  auth?: string
  /**
   * 业务员id
   */
  businessUserIds?: number[]
  /**
   * 港后跟单员Id
   */
  gangHouUserIds?: number[]
  /**
   * 物流渠道
   */
  logisticsChannelIds?: number[]
  /**
   * 物流产品
   */
  logisticsProductIds?: number[]
  /**
   * 服务商ID
   */
  merchantIds?: number[]
  /**
   * 页数, 从1开始
   */
  page: number
  /**
   * 搜索字段 1.运单号 2.渠道单号 3.FBA ID 4.柜号
   */
  searchField?: number
  /**
   * 搜索内容
   */
  searchWords?: string[]
  /**
   * 发货时间-起始
   */
  shipmentDateStart?: string
  /**
   * 发货时间-结束
   */
  shipmentDateStartEnd?: string
  /**
   * 每页大小
   */
  size: number
  /**
   * 页签 0.全部 11.待处理 12.待发货 13.待离港 14.运输中 15.待提取 16.中转中 17.派送中 18.已签收 19.已取消
   */
  tabId?: number
}

export interface IWaybillRecordListRes {
  /**
   * 当前页
   */
  current?: number
  /**
   * 总页数
   */
  pages?: number
  /**
   * 查询数据列表
   */
  records?: IWaybillRecordItem[]
  /**
   * 每页显示条数
   */
  size?: number
  /**
   * 总数
   */
  total?: number
}

export interface IWaybillRecordItem {
  /**
   * 时效,对于未签收运单 从发货日期到当前日期的天数差,对于已签收运单 签收日期到发货日期的天数差
   */
  age?: string
  /**
   * 件数，即箱数
   */
  boxNum?: string
  /**
   * 负责业务员id
   */
  businessUserId?: number
  /**
   * 柜号
   */
  containerNumber?: string
  /**
   * 当前预计送达日期
   */
  currentEdd?: string
  /**
   * 当前预计送达对应时区
   */
  currentEddZone?: string
  /**
   * 客户
   */
  customer?: string
  /**
   * 目的地地址代码
   */
  destinationCode?: string
  /**
   * 目的地-国家
   */
  destinationCountry?: string
  /**
   * 预计到港时间（Estimated Time of Arrival），显示格式为MM-DD
   */
  eta?: string
  /**
   * 预计离港时间（Estimated Time of Departure），显示格式为MM-DD
   */
  etd?: string
  /**
   * 对应下单中的：FBA_ID
   */
  fbaId?: string
  /**
   * 港后跟单员Id
   */
  ganghouUserId?: number
  /**
   * 最新轨迹-英文
   */
  latestEventEn?: string
  /**
   * 最新轨迹发生时间，格式为MM-DD HH:MM
   */
  latestEventTime?: string
  /**
   * 物流渠道编码
   */
  logisticsChannelCode?: string
  /**
   * 物流渠道ID
   */
  logisticsChannelId?: number
  /**
   * 物流渠道服务商
   */
  logisticsChannelMerchantServers?: string
  /**
   * 物流渠道名称
   */
  logisticsChannelName?: string
  /**
   * 物流渠道转单号
   */
  logisticsChannelTrackingNumber?: string
  /**
   * 物流产品ID
   */
  logisticsProductId?: number
  /**
   * 物流产品内置名称
   */
  logisticsProductInlineName?: string
  /**
   * 物流产品名称
   */
  logisticsProductName?: string
  /**
   * 消息类型: 1-Information 2-Notification 3-Alert
   */
  messageType?: number
  nextUpdateTime?: string
  /**
   * 下次更新时间提醒 1.红色代表逾期 2.绿色代表今天更新 3.黄色代表未设置更新时间 4.灰色代表更新时间晚于今天 5.白色代表已签收运单，不再需要更新时间提醒
   */
  nextUpdateTimeRemind?: number
  /**
   * Delivery Window,已预约送达时段
   */
  scheduledDeliveryTimeSlot?: string
  /**
   * 发货日期
   */
  shipmentDate?: string
  /**
   * ShipTrack同步状态图标 1.灰色代表不同步给ShipTrack（非FBA订单，历史订单FBA订单也请显示灰色） 2.绿色代表更新成功 3.红色代表更新失败)
   */
  shipTrackStatus?: number
  /**
   * 实际签收日期,显示格式为MM-DD
   */
  signingTime?: string
  /**
   * 人员信息
   */
  staffInfoList?: IStaffInfo[]
  /**
   * 船名(海运时必填)
   */
  vesselName?: string
  /**
   * 航次
   */
  voyageNumber?: string
  /**
   * 运单号
   */
  waybillNo: string
  /**
   * 运单状态 11.待处理 12.待发货 13.待离港 14.运输中 15.待提取 16.中转中 17.派送中 18.已签收 19.已取消:
   */
  waybillStatus?: number

  /**
   * 运输方式: 1.OCEAN 2.AIR 3.GROUND_TRUCK 4.GROUND_TRAIN
   */
  transportType?: number
}

export interface IStaffInfo {
  /**
   * 人员 1.业务人员 2.港后跟单 3.港前操作 4.港后操作
   */
  staffType?: number
  user?: IUser
}

export interface IUser {
  /**
   * 启用
   */
  active?: boolean
  /**
   * 头像
   */
  avatar?: string
  createdDate?: number
  /**
   * 部门ID
   */
  departmentId?: number
  /**
   * 英文姓名
   */
  englishName?: string
  /**
   * 性别
   */
  gender?: Gender
  id?: number
  loginDate?: number
  /**
   * 中文姓名
   */
  name?: string
  /**
   * 工号
   */
  num?: string
  /**
   * 密码
   */
  password?: string
  /**
   * 手机号
   */
  phone?: string
  /**
   * 职位
   */
  position?: string
  /**
   * 角色ID
   */
  roleId?: number
  /**
   * 账号
   */
  username?: string
}

export enum Gender {
  Man = 'MAN',
  Unknown = 'UNKNOWN',
  Woman = 'WOMAN',
}

export interface IWaybillRecordTabCount {
  /**
   * 订单数量
   */
  count?: number
  /**
   * 页签id，页签 0.全部 1.待处理 2.待发货 3.待离港 4.运输中 5.待提取 6.中转中 7.派送中 8.已签收 9.已取消
   */
  tabId?: number
}

export type IWaybillRecordTabCountRes = IWaybillRecordTabCount[]

/** 列表项 */
export type IWaybillRecordItemWithIndex = IWaybillRecordItem &
  AddressListODTO & {
    /** 操作 */
    action?: null
    /** 结果 */
    result?: string | number
    /** 航行天数 */
    transitDays?: null
    /** 起运港 */
    departureLocation?: string
    /** 目的港 */
    destinationLocation?: string
    /** 尾程运单号 */
    lastMileWaybillNo?: string
    /** 尾程服务商 */
    lastMileCarrier?: string
    /** 渠道服务等级（批量编辑使用） */
    logisticsChannelServiceLevel?: number
    /** 渠道服务最短时效（批量编辑使用） */
    logisticsChannelServiceTransitMin?: number
    /** 渠道服务最长时效（批量编辑使用） */
    logisticsChannelServiceTransitMax?: number
    /** 尾程运输方式 */
    lastMileTransportType?: number
    locationType?: number
    statusGroup?: number
    status?: number
    eventTemplate?: IEventTemplateEnableRes
    carrier?: string
    departureLocationId?: number
    departureLocationName?: string
    destinationLocationId?: number
    destinationLocationName?: string
    transportType?: number
  }

/** columnDefs 配置项 */
export type TCol<T extends keyof IWaybillRecordItemWithIndex = keyof IWaybillRecordItemWithIndex> = ColDef<
  IWaybillRecordItemWithIndex,
  IWaybillRecordItemWithIndex[T]
> & {
  field: T
}

export type TCellParams<T extends keyof IWaybillRecordItemWithIndex = keyof IWaybillRecordItemWithIndex> =
  ICellRendererParams<IWaybillRecordItemWithIndex, IWaybillRecordItemWithIndex[T]>

export interface IEventTemplateBatchActionForm {
  eventTemplate?: IEventTemplateEnableRes
  latestEventTime?: Dayjs
  updateEdd?: Dayjs
  updateEddZone?: string
  updateEddTime?: Dayjs
  nextUpdateTime?: Dayjs
  note?: string
}

export interface IUpdateServiceLevelBatchActionForm {
  logisticsChannelServiceLevel?: number
  logisticsChannelServiceTransitMin?: number
  logisticsChannelServiceTransitMax?: number
}

export interface IUpdateFirstLineBatchActionForm {
  carrier?: string
  vesselName?: string
  voyageNumber?: string
  containerNumber?: string
  departureLocation?: string
  etd?: Dayjs
  destinationLocation?: string
  eta?: Dayjs
}

export interface IUpdateTailLinesBatchActionForm {
  lastMileTransportType?: string
  lastMileCarrier?: string
}

export interface ISetPublishEventReq {
  /**
   * 认证信息
   */
  auth?: string
  /**
   * 城市
   */
  city?: string
  /**
   * 国家代码(ISO 2-letter)
   */
  countryCode?: string
  /**
   * 当前预计送达日期
   */
  currentEdd?: string
  /**
   * 当前预计送达对应时区
   */
  currentEddZone?: string
  /**
   * 轨迹模板ID
   */
  eventTemplateId?: number
  /**
   * 事件发生时间
   */
  eventTime?: string
  /**
   * 事件发生时间对应时区
   */
  eventTimeZone?: string
  /**
   * 下次更新日期/预计送达日期对应时区
   */
  nextUpdateAndEddZone?: string
  /**
   * 下次状态更新时间
   */
  nextUpdateTime?: string
  /**
   * 操作备注
   */
  note?: string
  /**
   * 邮政编码
   */
  postalCode?: string
  /**
   * 州/省
   */
  stateProvince?: string
  /**
   * street1
   */
  street1?: string
  /**
   * street2
   */
  street2?: string
  /**
   * 更新后的预计送达日期
   */
  updateEdd?: string
  /**
   * 更新后的预计送达日期对应时区
   */
  updateEddZone?: string
  /**
   * 运单号
   */
  waybillNo?: string
  /**
   * 地点类型: 1-始发地 2-集货仓 3-起运港 4-目的港 5-中转仓 6-目的地
   */
  locationType?: number

  /**
   * 状态组下的具体状态主状态-11.待处理 12.待发货 13.待离港 14.运输中 15.待提取 16.中转中 17.派送中 18.已签收 19.已取消; 报关-21.待审核
   * 22.待申报 23.申报中 24.查验中 25.已放行 26.已退单 27.已取消; 清关-31.待审核 32.待申报 33.申报中 34.待支付关税 35.查验中 36.已放行
   * 37.已退运 38.已取消; 预约-41.待处理 42.待预约 43.待确认 44.已确认 45.已签收 46.已回传 47.已拒收 48.已取消; 保险-51.待确认
   * 52.待投保 53.已投保 54.已拒绝 55.已取消; 异常-61.待分配 62.调查中 63.处理中 64.已解决 65.已关闭 66.已取消
   */
  status?: number
  /**
   * 状态组 1.主状态 2.报关 3.清关 4.预约 5.保险 6.异常
   */
  statusGroup?: number
}

export interface ISetBatchPublishEventReq {
  /**
   * 轨迹发布列表
   */
  publishPathIDTOS?: PublishPathIDTO[]
}

export interface PublishPathIDTO {
  /**
   * 认证信息
   */
  auth?: string
  /**
   * 城市
   */
  city?: string
  /**
   * 国家代码(ISO 2-letter)
   */
  countryCode?: string
  /**
   * 当前预计送达日期
   */
  currentEdd?: string
  /**
   * 当前预计送达对应时区
   */
  currentEddZone?: string
  /**
   * 轨迹模板ID
   */
  eventTemplateId?: number
  /**
   * 事件发生时间，格式：yyyy-MM-dd HH:mm:ss
   */
  eventTime?: string
  /**
   * 事件发生时间对应时区
   */
  eventTimeZone?: string
  /**
   * 下次更新日期/预计送达日期对应时区
   */
  nextUpdateAndEddZone?: string
  /**
   * 下次状态更新时间，格式：yyyy-MM-dd
   */
  nextUpdateTime?: string
  /**
   * 操作备注
   */
  note?: string
  /**
   * 邮政编码
   */
  postalCode?: string
  /**
   * 州/省
   */
  stateProvince?: string
  /**
   * street1
   */
  street1?: string
  /**
   * street2
   */
  street2?: string
  /**
   * 更新后的预计送达日期，格式：yyyy-MM-dd
   */
  updateEdd?: string
  /**
   * 更新后的预计送达日期对应时区
   */
  updateEddZone?: string
  /**
   * 运单号
   */
  waybillNo: string
}

export interface LogisticChannelSetIDTO {
  /**
   * 物流渠道服务商
   */
  logisticsChannelMerchantServers?: string
  /**
   * 物流渠道服务等级,1.Standard 2.Fast 3.Expedited
   */
  logisticsChannelServiceLevel?: number
  /**
   * 物流渠道服务最长时效(天)
   */
  logisticsChannelServiceTransitMax?: number
  /**
   * 物流渠道服务最短时效(天)
   */
  logisticsChannelServiceTransitMin?: number
  /**
   * 物流渠道转单号
   */
  logisticsChannelTrackingNumber?: string
  /**
   * 物流渠道运输方式,1.OCEAN 2.AIR 3.GROUND_TRUCK 4.GROUND_TRAIN
   */
  logisticsChannelTransportType?: number
  /**
   * '运单号'
   */
  waybillNo: string
}

export interface ISetBatchPublishLogisticsChannelReq {
  /**
   * 物流渠道服务等级更新列表
   */
  logisticChannelSetIDTOS?: LogisticChannelSetIDTO[]
}

export interface FirstLegInformationSetIDTO {
  /**
   * 承运商名称
   */
  carrier?: string
  /**
   * 集装箱编号,柜号(海运可选)
   */
  containerNumber?: string
  /**
   * 起运地点ID(港口/机场/车站)
   */
  departureLocationId?: number
  /**
   * 起运地点(港口/机场/车站/卡车)
   */
  departureLocationName?: string
  /**
   * 目的地点ID(港口/机场/车站)
   */
  destinationLocationId?: number
  /**
   * 目的地点ID(港口/机场/车站/卡车)
   */
  destinationLocationName?: string
  /**
   * 预计到港/降落/到达日期(格式: yyyy-MM-dd)
   */
  eta?: string
  /**
   * 预计离港/起飞/发车日期(格式: yyyy-MM-dd)
   */
  etd?: string
  /**
   * 航班号(空运时必填)
   */
  flightNumber?: string
  /**
   * 车次/卡车编号(铁路或卡车运输时必填)
   */
  trainTruckNumber?: string
  /**
   * 运输方式: 1.OCEAN 2.AIR 3.GROUND_TRUCK 4.GROUND_TRAIN
   */
  transportType: number
  /**
   * 船名(海运时必填)
   */
  vesselName?: string
  /**
   * 航次(海运时必填)
   */
  voyageNumber?: string
  /**
   * 运单号
   */
  waybillNo: string
}

export interface ISetBatchPublishFirstLegInformationReq {
  /**
   * 第一程信息更新列表
   */
  legInformationSetIDTOS?: FirstLegInformationSetIDTO[]
}

/**
 * LastMileSetIDTO
 */
export interface LastMileSetIDTO {
  /**
   * 尾程承运商名称
   */
  lastMileCarrier: string
  /**
   * 尾程运输方式,1.快递 2.卡车 3.Amazon Freight
   */
  lastMileTransportType?: number
  /**
   * 尾程运单号
   */
  lastMileWaybillNo: string
  /**
   * '运单号'
   */
  waybillNo: string
}

export interface ISetBatchPublishLastLegInformationReq {
  /**
   * 最后程信息更新列表
   */
  lastMileSetIDTOS?: LastMileSetIDTO[]
}

export type TUpdateBatchPublishReq =
  | ISetBatchPublishLogisticsChannelReq
  | ISetBatchPublishFirstLegInformationReq
  | ISetBatchPublishLastLegInformationReq

/**
 * 轨迹发布获取地址信息列表
 */
export interface AddressInfoIDTO {
  /**
   * 轨迹模板ID
   */
  eventTemplateId?: number
  /**
   * '运单号'
   */
  waybillNo: string
}

export interface IAddressInfoReq {
  /**
   * 轨迹发布获取地址信息列表
   */
  publishPathIDTOS?: AddressInfoIDTO[]
}

export interface IAddressInfoRes {
  addressListODTO?: AddressListODTO
  /**
   * 运单编号
   */
  waybillNo?: string
}

/**
 * 仓库详情
 */
export interface AddressListODTO {
  /**
   * 地址ID
   */
  addressId?: number
  /**
   * 地址类型 1.海运港口 2.空运机场 3.铁路站点 4.集货仓 5.中转仓
   */
  addressType?: number
  /**
   * 中文名
   */
  chineseName?: string
  /**
   * 城市
   */
  city?: string
  /**
   * 代码
   */
  code?: string
  /**
   * 联系人，始发地/目的地才有此值
   */
  contacts?: string
  /**
   * 国家
   */
  country?: string
  /**
   * 国家2字码
   */
  countryCode?: string
  /**
   * 联系邮箱，始发地/目的地才有此值
   */
  email?: string
  /**
   * 英文名
   */
  englishName?: string
  /**
   * 是否常用：0-否，1-是
   */
  isCommon?: number
  /**
   * 联系电话，始发地/目的地才有此值
   */
  phone?: string
  /**
   * 邮编
   */
  postalCode?: string
  /**
   * 省洲
   */
  stateProvince?: string
  /**
   * 详细地址1
   */
  street1?: string
  /**
   * 详细地址2
   */
  street2?: string
}

export interface IBatchSetRes {
  failTotal?: number
  failWaybills?: FailWaybill[]
  successTotal?: number
  total?: number
}

export interface FailWaybill {
  /**
   * 失败原因
   */
  failReason?: string
  /**
   * 运单号
   */
  waybillNo?: string
}
